﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using DAL.DALObjects;

namespace ShareIt_MVC3.Models
{
    public class ResourceCollection
    {
        string _databaseFile;   // String zur Access-Datei, wird im Konstruktor initialisiert
        UserCollection userColl = new UserCollection();

        /// <summary>
        /// User-Collection Konstruktor 
        /// </summary>
        public ResourceCollection() 
        {   
            // hier wird der Pfad zur Access-Datei aus web.config gelesen
            _databaseFile = System.Configuration.ConfigurationManager.AppSettings["AccessFileName"];

        }

        /// <summary>
        /// Erstellt eine Neue Ressource in der Datenbank.
        /// </summary>
        /// <param name="_dr"></param>
        /// <returns></returns>
        private Resource CreateResourceObject(DataRow _dr)
        {
            Resource resource = new Resource
            {
                ID = (int)_dr["RID"],
                Title = (String)_dr["RTitle"],
                Author = (String)_dr["RAuthor"],
                Owner = userColl.GetUserById((int)_dr["ROwner"]),
                Category = (String)_dr["RCategory"],
                Active = (bool)_dr["RActive"]
            };

            return resource;
        }

        /// <summary>
        /// Gibt alle im System vorhandenen Ressourcen zurück.
        /// </summary>
        /// <returns></returns>
        public List<Resource> GetAllResources()
        {   
            dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);
            DataSet _myDataSet = _myProvider.GetStoredProcedureDSResult("QGetAllResources");
            DataTable _myDataTable = _myDataSet.Tables[0];

            List<Resource> resources = new List<Resource>();

            foreach (DataRow _dr in _myDataTable.Rows)
            {
                //Wir füllen unsere Liste immer mit neuen Usern

                Resource resource = CreateResourceObject(_dr);

                resources.Add(resource);
            }
            
            return resources;
        }

        /// <summary>
        /// Gibt alle Ressourcen zurück die ausleihbar sind.
        /// </summary>
        /// <param name="userid"></param>
        /// <returns></returns>
        public List<Resource> GetBorrowableResources(int userid)
        {
            dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);
            _myProvider.AddParam("UID", userid, DAL.DataDefinition.enumerators.SQLDataType.INT);
            List<Resource> resources = new List<Resource>();

            try
            {
                DataSet _myDataSet = _myProvider.GetStoredProcedureDSResult("QGetBorrowableResources");
                DataTable _myDataTable = _myDataSet.Tables[0];

                foreach (DataRow _dr in _myDataTable.Rows)
                {
                    //Wir füllen unsere Liste immer mit neuen Usern

                    Resource resource = CreateResourceObject(_dr);

                    resources.Add(resource);
                }
            }
            catch
            {
                
            }

            return resources;

        }

        /// <summary>
        /// Gibt alle Ressourcen eines bestimmten Benutzers zurück.
        /// </summary>
        /// <param name="userid"></param>
        /// <returns></returns>
        public List<Resource> GetAllResourcesByUserID(int userid)
        {
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);
            _myProvider.AddParam("ID", userid, DAL.DataDefinition.enumerators.SQLDataType.INT);
            User owner = userColl.GetUserById(userid);
            DataSet _myDataSet = _myProvider.GetStoredProcedureDSResult("QGetAllResourcesByUserID");

            //das DataSet enthält nur eine DataTable
            DataTable _myDataTable = _myDataSet.Tables[0];

            //Instantiieren eine Liste von User-Objekten
            List<Resource> resources = new List<Resource>();

            //Lesen wir jetzt Zeile (DataRow) für Zeile
            foreach (DataRow _dr in _myDataTable.Rows)
            {
                //Wir füllen unsere Liste immer mit neuen Usern
                Resource resource = CreateResourceObject(_dr);
                resources.Add(resource);
            }
            return resources;

        }

        /// <summary>
        /// Gibt eine Ressource mit der übergebenen ID zurück.
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public Resource GetResourceByID(int id)
        {
            //Hier wird ein DB-Provider instanziiert und eine Verbindung zur access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);
            Resource resource = null;
            
            //Jetzt müssen wir erstmal den Übergabeparameter hinzufügen
            _myProvider.AddParam("ID", id, DAL.DataDefinition.enumerators.SQLDataType.INT);

            try
            {

                //Hier wird unser Dataset initialisiert
                DataSet _myDataSet = _myProvider.GetStoredProcedureDSResult("QGetResourceById");

                //füllen wir eine DataTable mit dem DataSet
                DataRow _dr = _myDataSet.Tables[0].Rows[0];

                resource = CreateResourceObject(_dr);
            }
            catch { }
            

            return resource;
        }

        /// <summary>
        /// Methode für die Suche.
        /// </summary>
        /// <param name="searchString"></param>
        /// <returns></returns>
        public List<Resource> Search(string searchString)
        {
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);
            _myProvider.AddParam("searchstring", "%" + searchString + "%", DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            

            UserCollection userColl = new UserCollection();
            
            DataSet _myDataSet = _myProvider.GetStoredProcedureDSResult("QSearchResources");

            //das DataSet enthält nur eine DataTable
            DataTable _myDataTable = _myDataSet.Tables[0];

            //Instantiieren eine Liste von User-Objekten
            List<Resource> resources = new List<Resource>();

            //Lesen wir jetzt Zeile (DataRow) für Zeile
            foreach (DataRow _dr in _myDataTable.Rows)
            {
                //Wir füllen unsere Liste immer mit neuen Ressourcen.
                Resource resource = new Resource();

                resource.ID = (int)_dr["RID"];
                resource.Title = (String)_dr["RTitle"];
                resource.Author = (String)_dr["RAuthor"];
                resource.Owner = userColl.GetUserById((int)_dr["ROwner"]);
                resource.Category = (String)_dr["RCategory"];
                resource.Active = (bool)_dr["RActive"];
                resources.Add(resource);
            }
            return resources;

        }

        /// <summary>
        /// Methode, die dazu verwendet wird die Ressource zu editieren.
        /// </summary>
        /// <param name="resource"></param>
        /// <returns></returns>
        public int UpdateResource(Resource resource)
        {

            //DB-Provider instanziiert und eine Verbindung zur access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            // Jetzt müssen wir erstmal die Übergabeparameter hinzufügen 
            // (Parameter in derselben Reihenfolge wie in der Access-Query)
            _myProvider.AddParam("Title", resource.Title, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("Author", resource.Author, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("Owner", resource.Owner.ID, DAL.DataDefinition.enumerators.SQLDataType.INT);
            _myProvider.AddParam("Category", resource.Category, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("Active", resource.Active, DAL.DataDefinition.enumerators.SQLDataType.BOOL);
            _myProvider.AddParam("RID", resource.ID, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);

            //Ausführen und veränderte Zeilen zurückgeben
            int _changedSets = _myProvider.MakeStoredProcedureAction("QUpdateResourceById");

            return _changedSets;

        } //updateUser()

        /// <summary>
        /// Einfügen einer neuen Ressource in das System.
        /// </summary>
        /// <param name="_Resource"></param>
        /// <returns></returns>
        public int InsertResource(Resource _Resource)
        {

            //DB-Provider instanziiert und eine Verbindung zur access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            // Jetzt müssen wir erstmal die Übergabeparameter hinzufügen 
            // (Parameter in derselben Reihenfolge wie in der Acess-Query)
            _myProvider.AddParam("Title", _Resource.Title, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("Author", _Resource.Author, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("Owner", _Resource.Owner.ID, DAL.DataDefinition.enumerators.SQLDataType.INT);
            _myProvider.AddParam("Category", _Resource.Category, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("Active", _Resource.Active, DAL.DataDefinition.enumerators.SQLDataType.BOOL);

            //Ausführen und veränderte Zeilen zurückgeben
            int _changedSets = _myProvider.MakeStoredProcedureAction("QResourceInsert");

            return _changedSets;
        }

        /// <summary>
        /// Löschen eines Userobjekts
        /// </summary>
        /// <param name="_User">User-Objekt mit geänderten Attributen</param>
        /// <returns>1 falls delete erfolgreich </returns>
        public int DeleteResource(Resource resource)
        {

            //DB-Provider instanziiert und eine Verbindung zur access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            // Übergabeparameter ID hinzufügen 
            _myProvider.AddParam("ID", resource.ID, DAL.DataDefinition.enumerators.SQLDataType.INT);

            //Ausführen und veränderte Zeilen zurückgeben
            int _changedSets = _myProvider.MakeStoredProcedureAction("QResourceDeleteById");

            return _changedSets;
        }
    }

}